#ifndef PERLIN_H
#define PERLIN_H

#include "vec3.h"

class perlin {
public:
    perlin();
    // 返回[-1,1]的 perlin 随机数
    double noise(const point3& p) const;
    // 返回[0,+∞]的随机数，叠加多个频率
    double turb(const point3& p, int depth) const;

private:
    static const int point_count = 256;
    vec3 randvec[point_count];// 存储随机数
    int perm_x[point_count];// 一个随机排列数组[9,2,19,0,....]
    int perm_y[point_count];
    int perm_z[point_count];

    static void perlin_generate_perm(int* p);
    static void permute(int* p, int n);
    static double trilinear_interp(double c[2][2][2], double u, double v, double w);
    static double perlin_interp(const vec3 c[2][2][2], double u, double v, double w);
};

#endif